package com.greentravel.service;

import com.greentravel.model.TravelRecord;
import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * 出行记录服务接口
 * 定义与出行记录相关的业务逻辑操作
 */
public interface TravelRecordService {

    /**
     * 添加出行记录
     * 
     * @param userId        用户ID
     * @param travelTime    出行时间
     * @param travelMode    出行方式
     * @param startLocation 起始地点
     * @param endLocation   终点
     * @param distance      出行距离
     * @return 是否添加成功
     */
    boolean addTravelRecord(int userId, Date travelTime, String travelMode, String startLocation, String endLocation,
            double distance);

    /**
     * 获取用户的出行记录列表
     * 
     * @param userId 用户ID
     * @return 出行记录列表
     */
    List<TravelRecord> getUserTravelRecords(int userId);

    /**
     * 获取用户在指定日期范围内的出行记录
     * 
     * @param userId    用户ID
     * @param startDate 开始日期
     * @param endDate   结束日期
     * @return 出行记录列表
     */
    List<TravelRecord> getUserTravelRecordsByDateRange(int userId, Date startDate, Date endDate);

    /**
     * 获取用户指定出行方式的记录
     * 
     * @param userId     用户ID
     * @param travelMode 出行方式
     * @return 出行记录列表
     */
    List<TravelRecord> getUserTravelRecordsByMode(int userId, String travelMode);

    /**
     * 计算用户总出行距离
     * 
     * @param userId 用户ID
     * @return 总距离（公里）
     */
    double getTotalDistance(int userId);

    /**
     * 计算用户总碳减排量
     * 
     * @param userId 用户ID
     * @return 总碳减排量（千克）
     */
    double getTotalCarbonReduction(int userId);

    /**
     * 计算用户各出行方式的使用次数
     * 
     * @param userId 用户ID
     * @return 出行方式及对应的使用次数
     */
    Map<String, Integer> getTravelModeStatistics(int userId);

    /**
     * 计算用户平均出行距离
     * 
     * @param userId 用户ID
     * @return 平均出行距离（公里）
     */
    double getAverageDistance(int userId);

    /**
     * 删除出行记录
     * 
     * @param recordId 记录ID
     * @return 是否删除成功
     */
    boolean deleteTravelRecord(int recordId);

    /**
     * 更新出行记录
     * 
     * @param record 出行记录对象
     * @return 是否更新成功
     */
    boolean updateTravelRecord(TravelRecord record);
}